package com.example.demo.main.string;

/**
 * @author xieluoyin
 *  
 */
public class IsRotation {
    public static void main(String[] args) {
        System.out.println(isRotation("abcd", "cdab"));
    }

    /**
     * 判断a和b是否互为旋转词。
     * 如果一个字符串str，把字符串str前面任意的部分挪到后面形成的字符串叫作str的旋转词。
     * 比如str="12345"，str的旋转词有"12345"、"23451"、"34512"、"45123"和"51234"。
     * 如果a和b的长度不一样，字符串a和b不可能互为旋转词。
     * 如果a和b长度一样，先生成一个大字符串b2，
     * b2是两个字符串b拼在一起的结果，即String b2=b+b。
     * 然后看b2中是否包含字符串a，如果包含，说明字符串a和b互为旋转词，
     * 否则说明两个字符串不互为旋转词。这是为什么呢？举例说明，
     * 假设a="cdab"，b="abcd"。b2="abcdabcd"，b2[0..3]=="abcd"是b的旋转词，
     * b2[1..4]=="bcda"是b的旋转词……b2[i..i+3]都是b的旋转词，b2[4..7]=="abcd"是b的旋转词。
     * 由此可见，如果一个字符串b长度为N。在通过b生成的b2中，任意长度为N的子串都是b的旋转词，
     * 并且b2中包含字符串b的所有旋转词。
     *
     * @param a a字符串
     * @param b b字符串
     * @return a与b是否是旋转词
     */
    public static boolean isRotation(String a, String b) {
        if (a == null || b == null || a.length() != b.length()) {
            return false;
        }
        String b2 = b + b;
        return b2.contains(a);
    }
}
